from visual import *
from math import *
import constants


def getDistanceFromPosition (place, position):
    temp = place - position
    d = math.sqrt(math.pow(temp.x, 2) + math.pow(temp.y, 2) + math.pow(temp.z, 2))
    return d
#racuna udaljenost mjesta udara od potencijalnog mjesta 

def getDistanceFromAxis(possiblePlace, canon):
    T = possiblePlace    
    A = canon.pos
    B = canon.axis + A
    TA = T - A
    TB = T - B
    BA = B - A
    d = (mag(TA.cross(TB))) / (mag(BA))
    print(" udaljenost slobodnog mjesta od axis", d)
    return d
#racuna udaljenost potencijalnog mjesta od pravca hica

def getPossiblePlaces (allBalls, minimumIndex, emptyPlaces):
    possiblePlaces = []
    print("trazi mjesto")
    for index in range(len(emptyPlaces)):
        place = emptyPlaces[index]
        position = allBalls[minimumIndex].pos
        d = getDistanceFromPosition (place, position)
        if d <= (constants.sphereDistance + 0.1): #tolerancija
            print ("dodaj u possiblePlaces index", index, "udaljenost od kugle je", d)
            possiblePlaces.append(index)
    return possiblePlaces
#dohvaca moguca slobodna mjesta oko pogodjene kugle

def getOnePlace(possiblePlaces, emptyPlaces, canon):
    minimumIndexPlace = possiblePlaces[0]
    minimumDistancePlace = emptyPlaces[minimumIndexPlace]
    minimumDistance = getDistanceFromAxis(minimumDistancePlace, canon)
    print ("pocetna  udaljenost mjesta od axis je", minimumDistance, "za index", minimumIndexPlace)
    for i in range(len(possiblePlaces)):
        index = possiblePlaces[i]
        if getDistanceFromAxis(emptyPlaces[index], canon) < minimumDistance: 
            minimumIndexPlace = index
            minimumDistance = getDistanceFromAxis(emptyPlaces[index], canon) 
            print ("nova minimalna udaljenost od axis je", minimumDistance, "za index", minimumIndexPlace)
    return minimumIndexPlace
#dohvaca konacno slobodno mjesto za novu kuglu na temelju udaljenosti od pravca topa
